﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using IbsysII.Domain;
using IbsysII.Util;
using Microsoft.Office.Interop.Excel;
using System.Windows.Controls;
using System.Globalization;
using System.Threading;
using System.IO;

namespace IbsysII
{
    /// <summary>
    /// Interaktionslogik für "App.xaml"
    /// </summary>
    public partial class App : System.Windows.Application
    {

        /// <summary>
        /// Liste von Liste mit den Produkten, P1=Index 0, P2=Index1,...
        /// </summary>
        public static List<List<Teil>> alleProdukte;
        public static List<List<Teil>> alleProdukteMitStammUndBewegung;
        public static List<Bestellung> lagerzugangAktuell;
        public static List<Bestellung> lagerzugangZukuenftig;
        /// <summary>
        /// Alle Stammdaten incl. Bewegungsdaten
        /// </summary>
        public static List<Teil> lstTeileP1;
        public static List<Teil> lstTeileP2;
        public static List<Teil> lstTeileP3;
        public static Dashboard db;
        public static ChartUmsatz cu = new ChartUmsatz();
        public static string aktPeriode;

        /// <summary>
        /// speichert die Informationen ueber die AP
        /// </summary>
        public static List<Arbeitsplatz> arbeitsplaetze;

        /// <summary>
        /// Warteliste und Bearbeitungsliste auslesen
        /// </summary>
        public static List<Warteliste> warteliste;
        public static List<Bearbeitung> bearbeitung;

        public static Microsoft.Office.Interop.Excel.Application xlApp;
        public static Microsoft.Office.Interop.Excel.Workbook xlWb;
        public static Microsoft.Office.Interop.Excel.Worksheet xlWs;
        public static Microsoft.Office.Interop.Excel.Range xlRng;
        public static TreeViewItem stuecklisteAlsBaumP1;
        public static TreeViewItem stuecklisteAlsBaumP2;
        public static TreeViewItem stuecklisteAlsBaumP3;
        public static List<int> stuecklisteAlsBaumMengeTmp;
        public static List<int> stuecklisteAlsBaumMengeP1;
        public static List<int> stuecklisteAlsBaumMengeP2;
        public static List<int> stuecklisteAlsBaumMengeP3;
        public static List<Produktionsauftrag> lstProgP1 = new List<Produktionsauftrag>();
        public static List<Produktionsauftrag> lstProgP2 = new List<Produktionsauftrag>();
        public static List<Produktionsauftrag> lstProgP3 = new List<Produktionsauftrag>();
        public static Bestellung lstBestellungen;
        public static List<Teil> vertrieb = new List<Teil>();
        public static List<Teil> direktVertrieb = new List<Teil>();

        public static List<Teil> lstMengenverwaltungSB;

        public static App Instance;
        public static String Directory;
        public event EventHandler LanguageChangedEvent;
        public static bool boolActualLanguage;

        public App()
        {
            // Initialize static variables
            Instance = this;
            Directory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

            // Load the Localization Resource Dictionary based on OS language
            SetLanguageResourceDictionary(GetLocXAMLFilePath(CultureInfo.CurrentCulture.Name));
        }

        /// <summary>
        /// Dynamically load a Localization ResourceDictionary from a file
        /// </summary>
        public void SwitchLanguage(string inFiveCharLang)
        {
            if (CultureInfo.CurrentCulture.Name.Equals(inFiveCharLang))
                return;

            var ci = new CultureInfo(inFiveCharLang);
            Thread.CurrentThread.CurrentCulture = ci;
            Thread.CurrentThread.CurrentUICulture = ci;

            if (null != LanguageChangedEvent)
            {
                LanguageChangedEvent(this, new EventArgs());
            }
            SetLanguageResourceDictionary(GetLocXAMLFilePath(inFiveCharLang));

            if (inFiveCharLang == "de-DE")
            {
                boolActualLanguage = false;
            }
            else 
            {
                boolActualLanguage = true;
            }
        }

        /// <summary>
        /// Returns the path to the ResourceDictionary file based on the language character string.
        /// </summary>
        /// <param name="inFiveCharLang"></param>
        /// <returns></returns>
        private string GetLocXAMLFilePath(string inFiveCharLang)
        {
            string locXamlFile = "LocalizationDictionary." + inFiveCharLang + ".xaml";
            return Path.Combine(Directory, inFiveCharLang, locXamlFile);
        }

        /// <summary>
        /// Sets or replaces the ResourceDictionary by dynamically loading
        /// a Localization ResourceDictionary from the file path passed in.
        /// </summary>
        /// <param name="inFile"></param>
        private void SetLanguageResourceDictionary(String inFile)
        {
            inFile = inFile.Replace("\\bin\\Debug", "");

            if (File.Exists(inFile))
            {
                // Read in ResourceDictionary File
                var languageDictionary = new ResourceDictionary();
                languageDictionary.Source = new Uri(inFile);

                // Remove any previous Localization dictionaries loaded
                int langDictId = -1;
                for (int i = 0; i < Resources.MergedDictionaries.Count; i++)
                {
                    var md = Resources.MergedDictionaries[i];
                    // Make sure your Localization ResourceDictionarys have the ResourceDictionaryName
                    // key and that it is set to a value starting with "Loc-".
                    if (md.Contains("ResourceDictionaryName"))
                    {
                        if (md["ResourceDictionaryName"].ToString().StartsWith("Loc-"))
                        {
                            langDictId = i;
                            break;
                        }
                    }
                }
                if (langDictId == -1)
                {
                    // Add in newly loaded Resource Dictionary
                    Resources.MergedDictionaries.Add(languageDictionary);
                }
                else
                {
                    // Replace the current langage dictionary with the new one
                    Resources.MergedDictionaries[langDictId] = languageDictionary;
                }
            }
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
           
            string projectPath = Environment.CurrentDirectory;
            //Für Setup auskoomentieren
            for (int i = 0; i < 2; i++)
            {
                projectPath = System.IO.Path.GetDirectoryName(projectPath);
            }
            projectPath = projectPath + @"\Daten\Stammdaten.xlsx";

            try
            {
                xlApp = new Microsoft.Office.Interop.Excel.Application();
                xlWb = App.xlApp.Workbooks.Open(projectPath, 0, false, 5, "", "", true, XlPlatform.xlWindows, "", true, true, 0, true, false, 0);
                App.xlWs = (Microsoft.Office.Interop.Excel.Worksheet)App.xlWb.Worksheets.get_Item("P1");
                App.xlRng = App.xlWs.UsedRange;
            }
            catch (Exception exc) { }

            alleProdukte = Stammdaten.ladeTeileStammdaten();

            lstTeileP1 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[0]);
            lstTeileP2 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[1]);
            lstTeileP3 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[2]);
            alleProdukteMitStammUndBewegung = new List<List<Teil>>();
            alleProdukteMitStammUndBewegung.Add(lstTeileP1);
            alleProdukteMitStammUndBewegung.Add(lstTeileP2);
            alleProdukteMitStammUndBewegung.Add(lstTeileP3);

            arbeitsplaetze = Stammdaten.ladeArbeitsplaetzeFromExcel();

            warteliste = Xpath_Zugriff.getLstWartelisteFromXML();
            bearbeitung = Xpath_Zugriff.getLstBearbeitunglisteFromXML();
            lagerzugangAktuell = Xpath_Zugriff.getLstBestellungAktuellerLagerzugang();
            lagerzugangZukuenftig = Xpath_Zugriff.getLstBestellungZukuenftigerLagerzugang();

            stuecklisteAlsBaumP1 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP1[0], new TreeViewItem());
            stuecklisteAlsBaumP2 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP2[0], new TreeViewItem());
            stuecklisteAlsBaumP3 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP3[0], new TreeViewItem());

            stuecklisteAlsBaumMengeP1 = new List<int>();
            stuecklisteAlsBaumMengeP2 = new List<int>();
            stuecklisteAlsBaumMengeP3 = new List<int>();

            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP1[0], stuecklisteAlsBaumMengeP1);
            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP2[0], stuecklisteAlsBaumMengeP2);
            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP3[0], stuecklisteAlsBaumMengeP3);

            lstMengenverwaltungSB = GUI_LOAD.getMengenverwaltungProdFuerSicherheitsb(alleProdukte);
            db = Xpath_Zugriff.getDashboardWerte();

            new Stammdaten().CloseExcel();
           
        }

        
        public static void reloadXMLInput() 
        {
            lstTeileP1 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[0]);
            lstTeileP2 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[1]);
            lstTeileP3 = Xpath_Zugriff.getLstTeileLagerbestandFromXml(alleProdukte[2]);

            alleProdukteMitStammUndBewegung = new List<List<Teil>>();
            alleProdukteMitStammUndBewegung.Add(lstTeileP1);
            alleProdukteMitStammUndBewegung.Add(lstTeileP2);
            alleProdukteMitStammUndBewegung.Add(lstTeileP3);

            //arbeitsplaetze = Stammdaten.ladeArbeitsplaetzeFromExcel();

            warteliste = Xpath_Zugriff.getLstWartelisteFromXML();
            bearbeitung = Xpath_Zugriff.getLstBearbeitunglisteFromXML();
            lagerzugangAktuell = Xpath_Zugriff.getLstBestellungAktuellerLagerzugang();
            stuecklisteAlsBaumP1 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP1[0], new TreeViewItem());
            stuecklisteAlsBaumP2 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP2[0], new TreeViewItem());
            stuecklisteAlsBaumP3 = GUI_LOAD.getStuecklisteAlsBaum(lstTeileP3[0], new TreeViewItem());

            stuecklisteAlsBaumMengeP1 = new List<int>();
            stuecklisteAlsBaumMengeP2 = new List<int>();
            stuecklisteAlsBaumMengeP3 = new List<int>();

            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP1[0], stuecklisteAlsBaumMengeP1);
            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP2[0], stuecklisteAlsBaumMengeP2);
            GUI_LOAD.getStuecklisteBaumMenge(lstTeileP3[0], stuecklisteAlsBaumMengeP3);

            lstMengenverwaltungSB = GUI_LOAD.getMengenverwaltungProdFuerSicherheitsb(alleProdukte);


            new Stammdaten().CloseExcel();
        }

    }
}
